<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta name="google-site-verification" content="TZE0rZyIqLl10trYu3BWBWa1Vmz6HFwhb2OcNEK4u-s" />
     <link rel="shortcut icon" href= /blog/img/favicon.ico >
    <title>
        cq’博客
    </title>
    <meta name="description" content= 嘿，我是程崎。欢迎访问！ >
    <meta name="keywords" content=  >
    
<link rel="stylesheet" href="/blog/libs/highlight/styles/monokai-sublime.css">

    
<link rel="stylesheet" href="/blog/libs/font-awesome/css/font-awesome.min.css">

    
<link rel="stylesheet" href="/blog/css/style.css">

<meta name="generator" content="Hexo 5.4.0"></head>
<body id="bodyx">
    <div class="hd posts">
    <a href="/blog/index.html"><i class="fa fa-home
 replay-btn" aria-hidden="true"></i></a>
    <div class="post-title">
        <p>
            JavaIO流笔记
        </p>
        <hr>
    </div>
    <div class="post-content">
        <h1 id="java-io"><a href="#java-io" class="headerlink" title="java.io"></a>java.io</h1><h2 id="java-io-OutputStream字节输出流"><a href="#java-io-OutputStream字节输出流" class="headerlink" title="java.io.OutputStream字节输出流"></a>java.io.OutputStream字节输出流</h2><p>这个抽象类是表示字节输出流的所有类的超类。</p>
<h3 id="定义了一些子类共性的成员方法"><a href="#定义了一些子类共性的成员方法" class="headerlink" title="定义了一些子类共性的成员方法"></a>定义了一些子类共性的成员方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">    -public void close()关闭此输出流并释放与此流相关联的任何系统资源。</span><br><span class="line">    -public void flush()刷新此输出流并强制任何缓冲的输出字节被写出。</span><br><span class="line">    -public void write(byte[] b)将 b.length字节从指定的字节数组写入此输出流。</span><br><span class="line">    -public void write(byte[] b, int off, int len)从指定的字节数组写入 len个字节，从偏移 off开始输出到此输出流。</span><br><span class="line">    -public abstract void write(int b)将指定的字节写入此输出流。</span><br><span class="line">java.io.FileOutputStream extends OutputStream</span><br><span class="line">FileOutputStream:文件字节输出流</span><br><span class="line">作用：把内存中的数据写入到硬盘的文件中</span><br></pre></td></tr></table></figure>

<h3 id="构造方法："><a href="#构造方法：" class="headerlink" title="构造方法："></a>构造方法：</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">FileOutputStream(String name)创建文件输出流以指定的名称写入文件。</span><br><span class="line">FileOutputStream(File file)创建文件输出流以写入由指定的 File对象表示的文件。</span><br><span class="line">参数：写入数据的目的</span><br><span class="line">    String name：目的地是一个文件的路径</span><br><span class="line">    File file：目的地是一个文件</span><br><span class="line">构造方法的作用：</span><br><span class="line">    1.创建一个FileOutputStream对象</span><br><span class="line">    2.会根据构造方法中传递的文件/文件路径，创建一个空的文件</span><br><span class="line">    3.会把FileOutputStream对象指向创建好的文件</span><br></pre></td></tr></table></figure>

<h3 id="写入数据的原理-内存–-gt-硬盘"><a href="#写入数据的原理-内存–-gt-硬盘" class="headerlink" title="写入数据的原理(内存–&gt;硬盘)"></a>写入数据的原理(内存–&gt;硬盘)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java程序--&gt;JVM(java虚拟机)--&gt;OS(操作系统)--&gt;OS调用写数据的方法--&gt;把数据写入到文件中</span><br></pre></td></tr></table></figure>

<h3 id="字节输出流的使用步骤-重点-："><a href="#字节输出流的使用步骤-重点-：" class="headerlink" title="字节输出流的使用步骤(重点)："></a>字节输出流的使用步骤(重点)：</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">1.创建一个FileOutputStream对象，构造方法中传递写入数据的目的地</span><br><span class="line">2.调用FileOutputStream对象中的方法write，把数据写入到文件中</span><br><span class="line">3.释放资源(流使用会占用一定的内存，使用完毕要把内存清空，提供程序的效率)</span><br></pre></td></tr></table></figure>

<h3 id="一次写多个字节方法："><a href="#一次写多个字节方法：" class="headerlink" title="一次写多个字节方法："></a>一次写多个字节方法：</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">-public void write(byte[] b)将 b.length字节从指定的字节数组写入此输出流。</span><br><span class="line">-public void write(byte[] b, int off, int len)从指定的字节数组写入 len个字节，从偏移 off开始输出到此输出流。</span><br></pre></td></tr></table></figure>

<h3 id="追加写-续写：使用两个参数的构造方法"><a href="#追加写-续写：使用两个参数的构造方法" class="headerlink" title="追加写/续写：使用两个参数的构造方法"></a>追加写/续写：使用两个参数的构造方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">FileOutputStream(String name, boolean append)创建文件输出流以指定的名称写入文件。</span><br><span class="line">FileOutputStream(File file, boolean append)创建文件输出流以写入由指定的 File对象表示的文件。</span><br><span class="line">参数：</span><br><span class="line">    String name ,File file：写入数据的目的地</span><br><span class="line">    boolean append：追加写开关 </span><br><span class="line">        true：创建对象不会覆盖原文件，继续在文件的末尾追加写数据</span><br><span class="line">        false：创建一个新文件，覆盖原文件</span><br></pre></td></tr></table></figure>

<h3 id="写换行：写换行符号"><a href="#写换行：写换行符号" class="headerlink" title="写换行：写换行符号"></a>写换行：写换行符号</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Windows:\r\n</span><br><span class="line">Linux:/n</span><br><span class="line">mac:/r</span><br></pre></td></tr></table></figure>

<h2 id="java-io-InputStream字节输入流"><a href="#java-io-InputStream字节输入流" class="headerlink" title="java.io.InputStream字节输入流"></a>java.io.InputStream字节输入流</h2><p>这个抽象类是表示输入字节流的所有类的超类。</p>
<h3 id="定义了一些子类共性的成员方法-1"><a href="#定义了一些子类共性的成员方法-1" class="headerlink" title="定义了一些子类共性的成员方法"></a>定义了一些子类共性的成员方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">    int	read()从输入流读取数据的下一个字节。</span><br><span class="line">    int	read(byte[] b)从输入流读取一些字节数，并将它们存储到缓冲区 b 。</span><br><span class="line">    void close()关闭此输入流并释放与流相关联的任何系统资源。</span><br><span class="line"></span><br><span class="line">java.io.FileInputStream extends InputStream</span><br><span class="line">FileInputStream：文件字节输入流</span><br><span class="line">作用：把文件中的数据，读取到内存中使用</span><br></pre></td></tr></table></figure>

<h3 id="构造方法：-1"><a href="#构造方法：-1" class="headerlink" title="构造方法："></a>构造方法：</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FileInputStream(String name)通过打开与实际文件的连接来创建一个 FileInputStream ，该文件由文件系统中的路径名 name命名。    FileInputStream(File file)通过打开与实际文件的连接创建一个 FileInputStream ，该文件由文件系统中的 File对象 file命名。    参数：读取文件的数据源        String name：文件的路径        File file：文件    构造方法的作用：        1.会创建一个FileInputStream对象        2.会把FileInputStream对象指向构造方法中要读取的文件</span><br></pre></td></tr></table></figure>

<h3 id="读取数据的原理-硬盘–-gt-内存"><a href="#读取数据的原理-硬盘–-gt-内存" class="headerlink" title="读取数据的原理(硬盘–&gt;内存)"></a>读取数据的原理(硬盘–&gt;内存)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java程序--&gt;JVM(java虚拟机)--&gt;OS(操作系统)--&gt;OS读取数据的方法--&gt;读取文件</span><br></pre></td></tr></table></figure>

<h3 id="字节输入流的使用步骤-重点"><a href="#字节输入流的使用步骤-重点" class="headerlink" title="字节输入流的使用步骤(重点)"></a>字节输入流的使用步骤(重点)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.创建FileInputStream对象，构造方法中绑定要读取的文件源    2.使用FileInputStream对象中的方法read，读取文件    3.释放资源</span><br></pre></td></tr></table></figure>

<p>代码部分</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.inputStream;<span class="keyword">import</span> java.io.FileInputStream;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo01InputStream</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        <span class="comment">//1.创建FileInputStream对象，构造方法中绑定要读取的文件源        FileInputStream fis = new FileInputStream(&quot;day20-File\\a.txt&quot;);        //2.使用FileInputStream对象中的方法read，读取文件        //int read()读取文件中的一个字节并返回，读取到文件的末尾返回-1        /*System.out.println(read);        read = fis.read();        System.out.println(read);        read = fis.read();        System.out.println(read);        */        /*            发现以上读写文件是一个重复的过程，所以可以使用循环优化            布尔表达式(read= fis.read())!=-1                1.fis.read()：读取一个字节                2.read= fis.read()：把读取到的字节赋值给变量len                2.(read= fis.read())!=-1：判断变量read是否不等于-1         */        int read;        while ((read= fis.read())!=-1)&#123;            System.out.println((char) read);        &#125;        //3.释放资源        fis.close();    &#125;&#125;</span></span><br></pre></td></tr></table></figure>

<h3 id="字节输入流一次读取多个字节的方法："><a href="#字节输入流一次读取多个字节的方法：" class="headerlink" title="字节输入流一次读取多个字节的方法："></a>字节输入流一次读取多个字节的方法：</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">int	read(byte[] b)从输入流读取一些字节数，并将它们存储到缓冲区 b 。</span><br></pre></td></tr></table></figure>

<h4 id="明确两件事情："><a href="#明确两件事情：" class="headerlink" title="明确两件事情："></a>明确两件事情：</h4><pre><code>    1.方法的参数byte[]的作用？        起到缓冲作用，存储每次读到的多个字节        数组的长度一般定义为1024    2.方法的返回值int是什么？
</code></pre>
<p>String类的构造方法</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。    String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。        offset：数组的开始索引 length：转换的字节个数</span><br></pre></td></tr></table></figure>

<p>代码部分</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.inputStream;<span class="keyword">import</span> java.io.FileInputStream;<span class="keyword">import</span> java.io.IOException;<span class="keyword">import</span> java.nio.charset.StandardCharsets;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo02InputStream</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        FileInputStream fis = <span class="keyword">new</span> FileInputStream(<span class="string">&quot;day20-File\\b.txt&quot;</span>);        <span class="comment">/*byte[] bytes = new byte[25];        fis.read(bytes);        System.out.println(new String(bytes, StandardCharsets.UTF_8));*/</span>        <span class="comment">/*            可以使用循环优化            不知道文件中有多少字节，所以用while循环            while循环结束的条件，读到-1结束         */</span>        <span class="keyword">byte</span>[] bytes = <span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">1024</span>];        <span class="keyword">int</span> len;        <span class="keyword">while</span> ((len=fis.read(bytes))!=-<span class="number">1</span>)&#123;            System.out.println(<span class="keyword">new</span> String(bytes,<span class="number">0</span>,len, StandardCharsets.UTF_8));        &#125;        fis.close();    &#125;&#125;</span><br></pre></td></tr></table></figure>

<h3 id="文件复制"><a href="#文件复制" class="headerlink" title="文件复制"></a>文件复制</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">文件复制练习：一读一写</span><br></pre></td></tr></table></figure>

<h4 id="明确："><a href="#明确：" class="headerlink" title="明确："></a>明确：</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">数据源：C:\Users\程崎\Pictures\Saved Pictures\deskback.jpg    数据的目的地：D:\Java学习\image\deskback.jpg</span><br></pre></td></tr></table></figure>

<h4 id="文件复制的步骤"><a href="#文件复制的步骤" class="headerlink" title="文件复制的步骤"></a>文件复制的步骤</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.创建一个字节输入流对象，构造方法中绑定要读取的数据源    2.创建一个字节输出流对象，构造方法中绑定要写入的目的地    3.使用字节输入流对象中的方法read读取文件    4.使用字节输出流的方法write写入到目的地的文件中    5.释放资源</span><br></pre></td></tr></table></figure>

<p>代码部分</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.copy;<span class="keyword">import</span> java.io.FileInputStream;<span class="keyword">import</span> java.io.FileOutputStream;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CopyFile</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        <span class="keyword">long</span> s = System.currentTimeMillis();        FileInputStream  fis = <span class="keyword">new</span> FileInputStream(<span class="string">&quot;C:\\Users\\程崎\\Pictures\\Saved Pictures\\deskback.jpg&quot;</span>);        FileOutputStream fos = <span class="keyword">new</span> FileOutputStream(<span class="string">&quot;D:\\Java学习\\image\\deskback.jpg&quot;</span>);        <span class="comment">/*//读取(一次读取一个字节，效率较低)        int len;        while ((len= fis.read())!=-1)&#123;            fos.write(len);        &#125;//复制文件共耗时6216毫秒*/</span>        <span class="comment">//使用数组缓冲读取多个字节，写入多个字节        byte[] bytes = new byte[1024];        int len;        while ((len= fis.read(bytes))!=-1)&#123;            fos.write(bytes,0,len);        &#125;//复制文件共耗时16毫秒        //释放资源(先关写的，后关读的)        fos.close();        fis.close();        long e = System.currentTimeMillis();        System.out.println(&quot;复制文件共耗时&quot;+(e - s)+&quot;毫秒&quot;);    &#125;&#125;</span></span><br></pre></td></tr></table></figure>

<h3 id="使用字节流读写中文文件"><a href="#使用字节流读写中文文件" class="headerlink" title="使用字节流读写中文文件"></a>使用字节流读写中文文件</h3><p>字符所占用字节</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GBK编码中，一个英文为一个字节，一个中文为两个字节。ASCII 码中，一个英文字母(不分大小写)为一个字节，一个中文汉字为两个字节。UTF-8 编码中，一个英文字为一个字节，一个中文为三个字节。Unicode 编码中，一个英文为一个字节，一个中文为两个字节。符号：英文标点为一个字节，中文标点为两个字节。例如：英文句号 . 占1个字节的大小，中文句号 。占2个字节的大小。UTF-16 编码中，一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。UTF-32 编码中，世界上任何字符的存储都需要 4 个字节。</span><br></pre></td></tr></table></figure>

<h2 id="java-io-Reader字符输入流"><a href="#java-io-Reader字符输入流" class="headerlink" title="java.io.Reader字符输入流"></a>java.io.Reader字符输入流</h2><p>字符输入流的最顶层的父类，定义了一些共性的成员方法，是一个抽象类</p>
<h3 id="共性的成员方法"><a href="#共性的成员方法" class="headerlink" title="共性的成员方法"></a>共性的成员方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">int	read()读一个字符并返回    int	read(char[] cbuf)一次读取多个字符，将字符读入数组。    void close()关闭流并释放与之相关联的任何系统资源。java.io.FileReader extends InputStreamReader extends ReaderFileReader：文件字符输入流作用：把硬盘文件中的数据以字符的方式读取到内存中</span><br></pre></td></tr></table></figure>

<h3 id="构造方法"><a href="#构造方法" class="headerlink" title="构造方法"></a>构造方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FileReader(String fileName)创建一个新的 FileReader ，给定要读取的文件的名称。FileReader(File file)创建一个新的 FileReader ，给出 File读取。参数：读取文件的数据源    String fileName：文件的路径    File file：一个文件构造方法的作用：    1.创建一个FileReader对象    2.会把FIleReader对象指向要读取的文件</span><br></pre></td></tr></table></figure>

<h3 id="字符输入流的使用步骤"><a href="#字符输入流的使用步骤" class="headerlink" title="字符输入流的使用步骤"></a>字符输入流的使用步骤</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.创建一个FileReader对象，构造方法中绑定要读取的数据源2.使用FileReader对象中方法read读取文件3.释放资源</span><br></pre></td></tr></table></figure>

<p>代码部分</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.reader;<span class="keyword">import</span> java.io.FileReader;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo02Reader</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        Long s = System.currentTimeMillis();        FileReader fileReader = <span class="keyword">new</span> FileReader(<span class="string">&quot;day20-File\\c.txt&quot;</span>);        <span class="comment">//单个字节读取        /*int len;        while((len = fileReader.read())!=-1)&#123;            System.out.print((char) len);        &#125;*/        //一次读取多个字节，将字符读入数组        char[] cs = new char[1024];//存储读到的有效字符个数        int len;        while((len= fileReader.read(cs))!=-1)&#123;            System.out.println(new String(cs,0,len));        &#125;        fileReader.close();        Long e = System.currentTimeMillis();        System.out.println(e-s);    &#125;&#125;</span></span><br></pre></td></tr></table></figure>

<h2 id="java-io-Writer字符输出流"><a href="#java-io-Writer字符输出流" class="headerlink" title="java.io.Writer字符输出流"></a>java.io.Writer字符输出流</h2><p>是所有字符输出流的超类，是一个抽象类</p>
<h3 id="共性的成员方法-1"><a href="#共性的成员方法-1" class="headerlink" title="共性的成员方法"></a>共性的成员方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">- Writer append(char c)将指定的字符附加到此作者。    - Writer ppend(CharSequence csq)将指定的字符序列附加到此作者。    - Writer ppend(CharSequence csq, int start, int end)将指定字符序列的子序列附加到此作者。     - abstract void close()关闭流，先刷新。     - abstract void flush()刷新流。    - void write(char[] cbuf)写入一个字符数组。     - abstract void write(char[] cbuf, int off, int len)写入字符数组的一部分。    - void write(int c)写一个字符    - void write(String str)写一个字符串    - void write(String str, int off, int len)写一个字符串的一部分。java.io.FileWriter extends OutputStreamWriter extends WriterFileWriter:文件字符输出流作用：把内存中字符数据写入到文件中</span><br></pre></td></tr></table></figure>

<h3 id="构造方法-1"><a href="#构造方法-1" class="headerlink" title="构造方法"></a>构造方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FileWriter(File file)给一个File对象构造一个FileWriter对象FileWriter(String fileName)构造一个给定文件名的FileWriter对象    参数：写入数据的目的地        String fileName：文件的路径        File file：文件    构造方法的作用：        1.会创建一个FIleWriter对象        2.会根据构造方法中的传递的文件/文件的路径，创建文件        3.会把FileWriter对象指向创建好的文件</span><br></pre></td></tr></table></figure>

<h3 id="字符输出流的使用步骤-重点"><a href="#字符输出流的使用步骤-重点" class="headerlink" title="字符输出流的使用步骤(重点)"></a>字符输出流的使用步骤(重点)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.创建FileWriter对象，构造方法中绑定要写入数据的目的2.使用FileWriter中的方法write，把数据写入到内存缓冲区中(字符转换为字节的过程)3.使用FileWriter中的flush，把内存缓冲区的数据，刷新到文件中4.释放资源(会把内存缓冲区中的数据刷新到文件中)</span><br></pre></td></tr></table></figure>

<p>代码部分</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.writer;<span class="keyword">import</span> java.io.FileWriter;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo01Writer</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        <span class="comment">//1.创建FileWriter对象，构造方法中绑定要写入数据的目的        FileWriter fileWriter = new FileWriter(&quot;day20-File\\d.txt&quot;);        //2.使用FileWriter中的方法write，把数据写入到内存缓冲区中(字符转换为字节的过程)        //void write(int c)写一个字符        fileWriter.write(97);        //3.使用FileWriter中的flush，把内存缓冲区的数据，刷新到文件中        fileWriter.flush();        //4.释放资源(会把内存缓冲区中的数据刷新到文件中)        fileWriter.close();    &#125;&#125;</span></span><br></pre></td></tr></table></figure>

<h3 id="flush方法和close方法的区别"><a href="#flush方法和close方法的区别" class="headerlink" title="flush方法和close方法的区别"></a>flush方法和close方法的区别</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-flush：刷新缓冲区，流对象可以继续使用-close：先刷新缓冲区，然后通知系统释放资源，流对象不可以再被使用了</span><br></pre></td></tr></table></figure>

<p>代码演示</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.writer;<span class="keyword">import</span> java.io.FileWriter;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo02FlushAndClose</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>&#123;        <span class="comment">//1.创建FileWriter对象，构造方法中绑定要写入数据的目的        FileWriter fileWriter = new FileWriter(&quot;day20-File\\e.txt&quot;);        //2.使用FileWriter中的方法write，把数据写入到内存缓冲区中(字符转换为字节的过程)        //void write(int c)写一个字符        fileWriter.write(97);        //3.使用FileWriter中的flush，把内存缓冲区的数据，刷新到文件中        fileWriter.flush();        //刷新之后流可以继续使用        fileWriter.write(98);        //4.释放资源(会把内存缓冲区中的数据刷新到文件中)        fileWriter.close();        //close方法之后流已被关闭，从内存中消失        fileWriter.write(99);       /*        报错信息：        Exception in thread &quot;main&quot; java.io.IOException: Stream closed        at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)        at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:113)        at java.io.OutputStreamWriter.write(OutputStreamWriter.java:194)        at com.cq.writer.Demo02FlushAndClose.main(Demo02FlushAndClose.java:24)        */    &#125;&#125;</span></span><br></pre></td></tr></table></figure>

<h3 id="续写和换行"><a href="#续写和换行" class="headerlink" title="续写和换行"></a>续写和换行</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">续写(追加写)：使用两个参数的构造方法    FileWriter(String fileName, boolean append)构造一个FileWriter对象，给出一个带有布尔值的文件名，表示是否附加写入的数据。    FileWriter(File file, boolean append)给一个File对象构造一个FileWriter对象。    参数：        String fileName：File file：写入数据的目的地        boolean append：续写开关             true：不会创建新的文件覆盖源文件，可以续写            false：创建新的文件覆盖源文件换行：换行符号    Windows:\r\n    Linux:/n    mac:/r</span><br></pre></td></tr></table></figure>

<h2 id="处理流中的异常"><a href="#处理流中的异常" class="headerlink" title="处理流中的异常"></a>处理流中的异常</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在jdk1.7之前使用try catch finally 处理流中的异常格式：    try&#123;        可能会出异常的代码    &#125;catch(异常类变量 变量名 )&#123;        异常的处理逻辑    &#125;finally&#123;        一定会执行的代码        资源释放    &#125;</span><br></pre></td></tr></table></figure>

<p>代码效果</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.cq.tryCatch;<span class="keyword">import</span> java.io.FileWriter;<span class="keyword">import</span> java.io.IOException;<span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Demo01TryCatch</span> </span>&#123;    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;        FileWriter fileWriter = <span class="keyword">null</span>;        <span class="keyword">try</span> &#123;            fileWriter = <span class="keyword">new</span> FileWriter(<span class="string">&quot;day20-File\\g.txt&quot;</span>,<span class="keyword">true</span>);            <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">10</span>; i++) &#123;                fileWriter.write(<span class="string">&quot;程崎喜欢霍文慧吖&quot;</span>+i+<span class="string">&quot;\r\n&quot;</span>);            &#125;        &#125;<span class="keyword">catch</span> (IOException e)&#123;            System.out.println(e);        &#125;<span class="keyword">finally</span> &#123;            <span class="keyword">if</span> (fileWriter!=<span class="keyword">null</span>)&#123;                <span class="keyword">try</span> &#123;                    fileWriter.close();                &#125; <span class="keyword">catch</span> (IOException e) &#123;                    e.printStackTrace();                &#125;            &#125;        &#125;    &#125;&#125;</span><br></pre></td></tr></table></figure>

<h3 id="JDK1-7异常的新特性"><a href="#JDK1-7异常的新特性" class="headerlink" title="JDK1.7异常的新特性"></a>JDK1.7异常的新特性</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在try后面可以加一个()，在括号中可以定义流对象那么这个流对象的作用域就在try中有效try中的代码执行完毕，会自动把流对象释放，不用写finally格式：    try(定义流对象；定义流对象)&#123;        可能会出异常的代码    &#125;catch(异常类变量 变量名 )&#123;        异常的处理逻辑    &#125;</span><br></pre></td></tr></table></figure>

<h3 id="JDK9异常的新特性"><a href="#JDK9异常的新特性" class="headerlink" title="JDK9异常的新特性"></a>JDK9异常的新特性</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">try的前面可以定义流对象在try后面的()可以直接引入流对象名称(变量名)</span><br></pre></td></tr></table></figure>

<h2 id="java-util-Properties集合"><a href="#java-util-Properties集合" class="headerlink" title="java.util.Properties集合"></a>java.util.Properties集合</h2><p>java.util.Properties集合 extends Hashtable&lt;k,v&gt; impl Map&lt;k,v&gt;<br>Properties类表示一组持久的属性。 Properties可以保存到流中或从流中加载。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Properties集合是唯一一个和IO流相结合的集合    可以使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储        void store(OutputStream out, String comments)        void store(Writer writer, String comments)        参数：            OutputStream out：字节输出流，不能写入中文            Writer writer：字符输出流，可以写中文            String comments：注释，用来解释说明保存的文件作用(不能使用中文，会产生乱码，默认是Unicode，一般使用&quot;&quot;空字符串)    可以使用Properties集合中的方法load，可以把硬盘中保存的文件(键值对)，读取到集合中使用        void load(InputStream inStream)        void load(Reader reader)            参数：                InputStream inStream：字节输入流，不能读取含有中文的键值对                Reader reader：字符输入流，能读取含有中文的键值对        使用步骤：            1.创建Properties集合对象            2.使用Properties集合中的方法load读取保存键值对的文件            3.遍历Properties集合        注意事项：            1.存储键值对的文件中，键与值默认的连接符号可以使用=，空格(其他符号)            2.存储键值对的文件中，可以使用#进行注释，被注释的键值对不会再被读取            3.存储键值对的文件中，键与值默认都是字符串，不用再加引号</span><br></pre></td></tr></table></figure>

<p>属性列表中的每个键及其对应的值都是一个字符串。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Properties集合是一个双列集合，key和value默认都是字符串</span><br></pre></td></tr></table></figure>

<h3 id="Properties集合操作字符串的特有方法"><a href="#Properties集合操作字符串的特有方法" class="headerlink" title="Properties集合操作字符串的特有方法"></a>Properties集合操作字符串的特有方法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Object setProperty(String key, String value)调用 Hashtable方法 put 。    String getProperty(String key)通过key找到value值，此方法相当于Map集合中的get(key)方法    Set&lt;String&gt; stringPropertyNames()返回此属性列表中的一组键，其中键及其对应的值为字符串，        此方法相当于Map集合中的keySet(key)方法</span><br></pre></td></tr></table></figure>

<h3 id="使用步骤"><a href="#使用步骤" class="headerlink" title="使用步骤"></a>使用步骤</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.创建Properties集合对象，添加数据2.创建字节输出流/字符输出流对象，构造方法中绑定要输出的目的地3.使用Properties集合中的方法store，把集合中的临时数据，持久化写入到硬盘中存储4.释放资源</span><br></pre></td></tr></table></figure>


    </div>

    
</div>
    <div class="footer" id="footer">
    <p><h4>Copyright © 2020 | Author: 程崎 | Theme By <a class="theme-author" target="_blank" rel="noopener" href="https://github.com/Xunzhuo/hexo-theme-coder" style="font-size:14px; color: #969696">Coder</a></h4>
    <label class="el-switch el-switch-blue el-switch-sm" style="vertical-align: sub;">
        <input type="checkbox" name="switch" id="update_style">
        <span class="el-switch-style"></span>
    </label>
    <!--         <script type="text/javascript">
    var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");
    document.write(unescape("%3Cspan id='cnzz_stat_icon_1278548644'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "v1.cnzz.com/stat.php%3Fid%3D1278548644%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));
    </script> -->
</p>
</div>
<input type="hidden" id="web_style" value="black">
<input type="hidden" id="valine_appid" value="NOsswOncKgc8HOxqo9oxIWlX-gzGzoHsz">
<input type="hidden" id="valine_appKey" value="z1FihjWEbS8uIfUQdmCtK7zz">

<script src="/blog/libs/jquery.min.js"></script>


<script src="/blog/libs/highlight/highlight.pack.js"></script>

<script src='//cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>

<script src="/blog/js/js.js"></script>

<style type="text/css">
.v * {
color: #698fca;
}
.v .vlist .vcard .vhead .vsys {
color: #3a3e4a;
}
.v .vlist .vcard .vh .vmeta .vat {
color: #638fd5;
}
.v .vlist .vcard .vhead .vnick {
color: #6ba1ff;
}
.v a {
color: #8696b1;
}
.v .vlist .vcard .vhead .vnick:hover {
color: #669bfc;
}
</style>
    <script type="text/javascript" color="173,174,173" opacity='1' zIndex="-2" count="99" src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"></script>
</body>
</html>
